前一篇帶各位透過匯入 Session 達到不必輸入帳號密碼便可登入的目的。
今天要開始撰寫 Instagram 點擊好友貼文讚的功能。將會帶各位用開發工具分析 Instagram 中貼文的結構,以及透過 Selenium 達到自動點擊的效果。
到達好友的個人頁面後,用 Selenium 鎖定貼文的元素。
用 for-loop 遍歷所有的貼文,並點擊貼文。
鎖定按贊的元素,並點擊該元素。
首先先決定要點擊哪位好友的貼文的贊。這邊創了一個帳號。 https://www.instagram.com/beeson_owo/
來延續昨天的內容,並將目標網址更改。
from selenium import webdriver
from time import sleep
import json
if __name__ == '__main__':
with open('cookies_jar.json') as f:
cookies = json.load(f)
driver = webdriver.Chrome()
driver.get('https://www.instagram.com/beeson_owo/')
for cookie in cookies:
driver.add_cookie(cookie)
driver.get('https://www.instagram.com/beeson_owo/')
接下來用開發工具來分析貼文的架構。
可以發現會是三個貼文為一個單位,這個單位的 class 為 Nnq7C weEfm
一個單位下有三個貼文,並有著 class v1Nh3 kIKUG _bz0w
。
接下來,我們能寫個程式來鎖定所有貼文,可以發現確實鎖定到 10 個貼文了,對應此帳號有 10 個貼文。
from selenium import webdriver
from time import sleep
import json
if __name__ == '__main__':
with open('cookies_jar.json') as f:
cookies = json.load(f)
driver = webdriver.Chrome()
driver.get('https://www.instagram.com/beeson_owo/')
for cookie in cookies:
driver.add_cookie(cookie)
driver.get('https://www.instagram.com/beeson_owo/')
sleep(2)
# 鎖定此帳號貼文的 class name
eles = driver.find_elements_by_class_name('v1Nh3')
print(eles)
print(len(eles))
'''
[<selenium.webdriver.remote.webelement.WebElement (session="ab11e2a6e736d79e6d235a6ebbcfe806", element="438ad8f3-a57d-4e07-883a-572f076c8b63")>, <selenium.webdriver.remote.webelement.WebElement (session="ab11e2a6e736d79e6d235a6ebbcfe806", element="b9858a5d-5a6f-4231-980e-7a33c14bb3d3")>, <selenium.webdriver.remote.webelement.WebElement (session="ab11e2a6e736d79e6d235a6ebbcfe806", element="7752ff18-63ee-4fc7-8699-554e30226897")>, <selenium.webdriver.remote.webelement.WebElement (session="ab11e2a6e736d79e6d235a6ebbcfe806", element="fa2d42b7-6a7a-4eef-8b94-a57ff7ecdfb0")>, <selenium.webdriver.remote.webelement.WebElement (session="ab11e2a6e736d79e6d235a6ebbcfe806", element="0d21b12e-b677-463a-9fae-1dad863cc971")>,
<selenium.webdriver.remote.webelement.WebElement (session="ab11e2a6e736d79e6d235a6ebbcfe806", element="278e2600-64ac-4b3c-b8b2-e1d44e8292c0")>, <selenium.webdriver.remote.webelement.WebElement (session="ab11e2a6e736d79e6d235a6ebbcfe806", element="305f8b99-7e0c-47e0-a742-4bc0baf3c9c9")>, <selenium.webdriver.remote.webelement.WebElement (session="ab11e2a6e736d79e6d235a6ebbcfe806", element="83fede31-f2b2-4628-8de1-7f798418601b")>, <selenium.webdriver.remote.webelement.WebElement (session="ab11e2a6e736d79e6d235a6ebbcfe806", element="1c6bb1a6-249c-45c4-8db8-b28a8693faca")>, <selenium.webdriver.remote.webelement.WebElement (session="ab11e2a6e736d79e6d235a6ebbcfe806", element="c9ae8328-e8f1-4521-810d-a521bc2e9e4f")>]
10
'''
接下來可以寫個 for-loop 將所有貼文的元素點擊一次。
這邊先將第一個點擊後 break 掉,因為還未撰寫點贊的功能。
from selenium import webdriver
from time import sleep
import json
if __name__ == '__main__':
with open('cookies_jar.json') as f:
cookies = json.load(f)
driver = webdriver.Chrome()
driver.get('https://www.instagram.com/beeson_owo/')
for cookie in cookies:
driver.add_cookie(cookie)
driver.get('https://www.instagram.com/beeson_owo/')
sleep(2)
eles = driver.find_elements_by_class_name('v1Nh3')
for ele in eles:
ele.click()
break
接下來透過開發工具鎖定贊元素的位置,相同地,一樣使用 click 點擊它。
發現贊是個 class 稱為 fr66n
的元素。
from selenium import webdriver
from time import sleep
import json
if __name__ == '__main__':
with open('cookies_jar.json') as f:
cookies = json.load(f)
driver = webdriver.Chrome()
driver.get('https://www.instagram.com/beeson_owo/')
for cookie in cookies:
driver.add_cookie(cookie)
driver.get('https://www.instagram.com/beeson_owo/')
sleep(2)
eles = driver.find_elements_by_class_name('v1Nh3')
for ele in eles:
ele.click()
sleep(1)
driver.find_element_by_class_name('fr66n').click()
break
可以看到成功點擊喜歡了,點擊完成後,要退出該頁面。退出頁面十分容易,依樣畫葫蘆地,鎖定叉叉的元素,並點擊它。
這邊用 XPath 進行定位,可以在開發工具中複製該元素的 XPath,並用 find_element_by_xpath 進行定位。
可以看到確實關閉了貼文頁面了。
from selenium import webdriver
from time import sleep
import json
if __name__ == '__main__':
with open('cookies_jar.json') as f:
cookies = json.load(f)
driver = webdriver.Chrome()
driver.get('https://www.instagram.com/beeson_owo/')
for cookie in cookies:
driver.add_cookie(cookie)
driver.get('https://www.instagram.com/beeson_owo/')
sleep(2)
eles = driver.find_elements_by_class_name('v1Nh3')
for ele in eles:
ele.click()
sleep(1)
driver.find_element_by_class_name('fr66n').click()
sleep(1)
driver.find_element_by_xpath('/html/body/div[6]/div[3]/button').click()
break
接下來我們能將 break 拿掉,看是否會成功將所有貼文按一次贊。
注意要在每次迴圈完成後 sleep 一下,讓資源載入,整體會更加穩定,讀者也能調整 sleep 的時間調配出最適合的速度。
from selenium import webdriver
from time import sleep
import json
if __name__ == '__main__':
with open('cookies_jar.json') as f:
cookies = json.load(f)
driver = webdriver.Chrome()
driver.get('https://www.instagram.com/beeson_owo/')
for cookie in cookies:
driver.add_cookie(cookie)
driver.get('https://www.instagram.com/beeson_owo/')
sleep(2)
eles = driver.find_elements_by_class_name('v1Nh3')
for ele in eles:
ele.click()
sleep(1)
driver.find_element_by_class_name('fr66n').click()
sleep(1)
driver.find_element_by_xpath('/html/body/div[6]/div[3]/button').click()
sleep(1)
可以看到成功將所有貼文點贊了。
今天加入了將所有貼文點贊的功能,透過鎖定了所有貼文遍歷,每次點擊該貼文並按贊之後關閉該貼文。
明天會帶各位實戰 Discord 的自動留言爬蟲。
Instagram: https://www.instagram.com/
Selenium with Python docs : https://selenium-python.readthedocs.io/
Selenium docs : https://readthedocs.org/projects/selenium-python/downloads/pdf/latest/